

/**
 * Name	          Description
 * id	          此对象的唯一标识符。如果未提供，则将生成GUID。
 * name	          要显示给用户的可读名称。它不必是唯一的。
 * availability	  与此对象相关联的可用性（如果有）。
 * show	          一个布尔值，指示是否显示该实体及其子代。
 * description	  一个字符串属性，用于为此实体指定HTML描述。
 * position	      指定实体位置的属性。
 * orientation	  指定实体方向的属性。
 * viewFrom	      用于查看该对象的建议初始偏移量。
 * parent	      要与此实体相关联的父实体。
 * billboard	  与此实体相关联的广告牌。
 * box	          与该实体关联的框。
 * corridor	      与此实体相关联的走廊。
 * cylinder	      要与此实体相关联的圆柱体。
 * ellipse	      与此实体相关联的椭圆。
 * ellipsoid	  与此实体相关联的椭球。
 * label	      与此实体相关联的options.label。
 * model	      与此实体相关联的模型。
 * tileset	      要与此实体相关联的3D Tiles图块。
 * path	          与此实体相关联的路径。
 * plane	      与此实体相关联的平面。
 * point	      与该实体关联的点。
 * polygon	      要与此实体相关联的多边形。
 * polyline	      与此实体相关联的折线。
 * properties	  与此实体相关联的任意属性。
 * polylineVolume 与此实体相关联的polylineVolume。
 * rectangle	  与此实体相关联的矩形。
 * wall	          与该实体关联的墙。

 */

const Cesium = window['Cesium'];


export default class entities {
    viewer;
    constructor(viewer) {
        this.viewer = viewer;
    }
    /**
     * 场景中的简单图标加载方法
     * @param sub 
     * @returns 
     */
    addCountryPoint = (sub) => {
        const { postiton, url, color, id, text, type, data, polyline } = sub;

        /**
         * 添加到场景中去
         */
        let polylines = polyline ? {
            positions: Cesium.Cartesian3.fromDegreesArrayHeights([
                postiton[0], postiton[1], postiton[2] - 240,
                postiton[0], postiton[1], postiton[2] + 25,
            ]),
            width: 1,
            material: new Cesium.Color(color[0] / 255, color[1] / 255, color[2] / 255, 1),
            // scaleByDistance: new Cesium.NearFarScalar(1000, 1.0, 1000, 0.001),
            data: {}
        } : {};

        let billsub = polyline ? {

            scaleByDistance: new Cesium.NearFarScalar(10000, 1.0, 10000, 0.001)
        } : {};
        let position = Cesium.Cartesian3.fromDegrees(
            postiton[0], postiton[1], postiton[2] + 26
        );
        return this.viewer.entities.add({
            type: "Hotspotbillboard",
            position: position,
            id: id,
            billboard: {
                image: url,
                sizeInMaters: true,
                height: 45,
                width: polyline ? 50 : 45,
                // 
                ...billsub
            },
            polyline: { ...polylines },
            label: {
                text: text,
                font: '16pt Helvetica',
                style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                outlineWidth: 1,

                fillColor: new Cesium.Color(1, 1, 1),
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
                pixelOffset: new Cesium.Cartesian2(0, -28),

            },
            data: {
                type: type,
                data: { ...data }
            }
        });

    }

    /**
     * 开发区图表绘制
     * @param sub 
     * @returns 
     */
    addkfqPoint = (sub) => {
        const { postiton, url, id, text, type } = sub;

        /**
         * 添加到场景中去
         */
        let position = Cesium.Cartesian3.fromDegrees(
            postiton[0], postiton[1], postiton[2] + 26
        );
        return this.viewer.entities.add({
            type: "HotspotbillboardOPO",
            position: position,
            id: id,
            billboard: {
                image: url,
                height: 50,
                width: 65,
            },
            label: {
                text: text,
                font: "64px roboto,sana-serif",
                style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                outlineWidth: 0,
                outlineColor: Cesium.Color.BLACK,
                fillColor: new Cesium.Color(1, 1, 1.0),
                scale: 0.25,
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
                pixelOffset: new Cesium.Cartesian2(0, -2.5),
                backgroundColor: new Cesium.Color(0.149, 0.149, 0.149, 0.64),
                showBackground: true,
            },
            data: {
                type: type
            }
        });

    }
    /**
     * 开发区图表绘制
     * @param sub 
     * @returns 
     */
    addkfqLabelt = (sub) => {
        const { postiton, url, id, text, type } = sub;

        /**
         * 添加到场景中去
         */
        let position = Cesium.Cartesian3.fromDegrees(
            postiton[0], postiton[1], postiton[2] + 26
        );
        return this.viewer.entities.add({
            type: "HotspotbillboardOPO",
            position: position,
            id: id,
            label: {
                text: text,
                font: "64px roboto,sana-serif",
                style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                outlineWidth: 0,
                outlineColor: Cesium.Color.BLACK,
                fillColor: new Cesium.Color(1, 1, 1.0),
                scale: 0.25,
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
                pixelOffset: new Cesium.Cartesian2(0, -2.5),
                backgroundColor: new Cesium.Color(0, 0, 0, 0.01)
            },
            data: {
                type: type
            }
        });

    }
    /**
     * 添加人员信息图标
     */
    addCrewEntity = (sub) => {
        const { postiton, url, id, text, type, data } = sub;

        /**
         * 添加到场景中去
         */

        let positions = Cesium.Cartesian3.fromDegrees(
            Number(postiton[0]), Number(postiton[1]), Number(postiton[2]) + 10
        );

        return this.viewer.entities.add({
            type: "Hotspotbillboard",
            position: positions,
            id: id,
            billboard: {
                image: url,
                height: 50,
                width: 160,
            },
            label: {
                text: text,
                font: "84px roboto,sana-serif",
                style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                outlineWidth: 0,
                outlineColor: Cesium.Color.BLACK,
                fillColor: new Cesium.Color(1, 1, 1.0),
                scale: 0.25,
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
                pixelOffset: new Cesium.Cartesian2(0, 5),
                backgroundColor: new Cesium.Color(0.117, 0.152, 0.192, 0.8),
                showBackground: true,
            },
            polyline: {
                positions: Cesium.Cartesian3.fromDegreesArrayHeights([
                    Number(postiton[0]), Number(postiton[1]), Number(postiton[2]) - 10,
                    Number(postiton[0]), Number(postiton[1]), Number(postiton[2]) + 8,
                ]),
                width: 1,
                material: new Cesium.Color(1, 1, 1, 0.8),
                scaleByDistance: new Cesium.NearFarScalar(1000, 1.0, 1000, 0.001),
                data: {}
            },
            data: {
                type: type,
                data: data
            }
        });
    }
    /**
     * 移除实体
     */
    removeEntities = (radarId) => {
        /**
         * 根据id获取实体
         */
        var radar = this.viewer.entities.getById(radarId);

        /**
         * 当实体存在时删除实体
         */
        if (radar) {
            this.viewer.entities.remove(radar)
        }
    }
    /**
     * 
     * @param postiton 经纬度
     */
    toEntities = (entities) => {
        if (entities instanceof Object) {
            this.viewer.flyTo(entities);
        }
    }
}